home *** CD-ROM | disk | FTP | other *** search
- .TITLE KERMIT-65 Super serial com card - interupt driven
- .SBTTL 6502 version - Ted Medin
-
- ; Version 1.0
- ; Warning interupts must be allowed by card.
- ; This means sw2-6 MUST be on.
-
- ; Based on the KERMIT Protocol.
-
- ; $Header: appssc.m65,v 1.15 90/10/15 14:27:07 medin Locked $
- .SBTTL Define start address for assembly
-
- .=$1003 ;[39] Start assembly here
-
- debug = 0 ;[1] debug flag - when 0 will not add debug code
- .SBTTL Revision History
-
- ;
- ; Edit # Description
- ; ------ -----------
- ;
- .ifne 0 ; get around the revisions
- ; DONT FORGET TO UPDATE THE VERSION
- ;$Log: appssc.m65,v $
- Revision 1.15 90/10/15 14:27:07 medin
- new org of $7f00 for 3.87
- version 1.15
-
- ;Revision 1.14 88/12/22 09:13:22 medin
- ;verison 1.14 changes for time count, input buffer now $900 and
- ;it now drops line via dtr.
-
- ;Revision 1.13 88/08/16 16:24:17 medin
- ;fix break so it doesnt drop dtr
-
- ;Revision 1.12 88/04/27 18:11:45 medin
- ;Shut off interupts when exiting kermit
-
- ;Revision 1.11 88/01/15 08:40:25 medin
- ;New origin for 3.81
-
- ;Revision 1.10 87/12/10 10:38:18 medin
- ;Polish code thats all.
-
- ;Revision 1.9 87/06/29 09:51:39 medin
- ; Change org to work with 3.78 & change wait rtn to handle apple rom rtn
-
- ;Revision 1.8 87/05/13 18:12:38 medin
- ; Change org to correspond with 3.76
-
- ;Revision 1.7 87/02/20 23:18:59 medin
- ; Put version number in the herald which is displayed by the main
- ;routine. Thanks to Rhoda for that idea.
-
- ;Revision 1.6 87/02/17 08:39:23 medin
- ; Clean up code for //c interupts. Debug turned off.
-
- ;Revision 1.5 87/01/28 08:24:38 medin
- ;Redo the driver so that the //c will operate correctly. The output
- ;interupt is always left on thus the //c will give the driver bith
- ;interupts without any special memory locations.
-
- ;Revision 1.4 87/01/08 11:39:41 medin
- ;Paul Close's changes to allow the super serial with interupts to
- ;work on a //c. Some slight changes to lock out interupts in critical
- ;phases.
-
- ;Revision 1.3 86/12/09 13:22:13 medin
- ; Slight change to the initialization for the //e+ & //c.
- ;The stack would get corrupted in case there were multiple interupts
- ;and we had to pass an interupt to the next requester.
- ;
- ;Revision 1.2 86/10/31 10:30:13 medin
- ; Add debug code which may be optionaly generated.
- ;Change the flow control commands to wait till the xon/xoff actually
- ;is sent down the line.
- ;
- ;Revision 1.1 86/10/28 10:20:03 medin
- ;Initial revision
- .endc
- ;
- ;
- ; Vector for com cards starts here
- ; location $1003 for data
- ; location $1020 for routine jumps
- ; location $1040 for main routines
- ;
- sscdbd: .blkb 1 ;[54]contains baud index(ala super serial card) used by init
- ; 6 - 300 baud
- ; 7 - 600
- ; etc
- .blkb 1 ;
- crdnam: .word herld ;[54] null terminated string of who we are
- kersli: .blkb 1 ;[54] com slot $n0
- kerins: .blkb 1 ;[54] force initialization flag-when 0
- endker: .blkb 2 ;[54] address of end of main kermit
- flowfg: .blkb 1 ;[57] flow flag for xon/xoff controll b7=1 yes
- tl0end .word endcom ;[1.11] end of this routine
- timect .blkb 1 ;[1.14] time constant for rom wait rtn
- .=sscdbd+29 ;[54] future expansion
- tlinit: jmp tl2int ;[54] initialize com card
- tl0cmd: jmp tl2cmd ;[54] command in A reg
- ;
- ;[54] 0 - hang up
- ;[54] $0b - set baud
- ;[54] $0c - set break on the line
- ;[57] $91 - turn remote on (xon)
- ;[57] $93 - turn remote off(xoff)
- ;
- ;[54] routine will return false(0) if unable
- tl0cp: jmp tl2cp ;[54] check for input ch ready-0 false
- tl0gpc: jmp tl2gpc ;[54] get input ch
- tl0ppc: jmp tl2ppc ;[54] put output character
- tl0exi: jmp tl2exi ;[54] reset card and restore initialized
- .=sscdbd+29+32 ;[54] futures
- ;[1.9]wait: .blkb 3 ;[54] wait routine-a reg contains milliseconds
- wait: .blkb 3 ;[1.9] wait routine-use rom wait 220=125ms 25=2ms
- prstr: .blkb 3 ;[54] print string x=lsb,y=msb x&y->null terminated string
- rdkey: .blkb 3 ;[54] read keyboard
- prcrlf: .blkb 3 ;[54] print cr and lf
- telcnc: .blkb 3 ;[54] check for keyboard character
- telspa: .blkb 3 ;[57] set character parity
- prbyte = $fdda ; Routine - Print A-reg as 2 hex nibbles
-
- .=$7f00 ;[1.15][1.11][1.9][1.8] place to start com card assembly
- start = . ;need a label at begining
- kr2pch = $c088 ;[22] Port character base (Super Serial card)
- kr2pst = $c089 ;[22] Port strobe base (Super Serial card)
- kr2pcr = $c08a ;[41] Base for prot control register (SSC)
- kr2pcc = $c08b ;[47] Com control
- mncinb = $18 ;[47] Control port init(8 bit,no par,1-stop,1200 baud)
- mnminb = $5 ;[51] Master port init(DTR, IRQ interups) & output interupts
- mnint = 1 ;[1.14] input interupt only
- mssinb = $8 ;[51] status bit for input ready
- mssoub = $10 ; status bit for output ready
- mssodb = 4 ;[1.8] overrun detected bit =1 then yes
- moutb = $c ;[51] mask for the output bits of command
- moutnt = $4 ;[51] command to start output with interupts
- true = 1 ; a true response
- false = 0 ; a false "
- inptr .byte 0 ;[51] input q pointer
- pinptr .byte 0 ;[51] p "
- outptr .byte 0 ;[51] output q pointer
- poutpt .byte 0 ;[51] p "
- hdirq .word ;[51] hold area for dos IRQ
- xon: .byte 0 ;[57] flow controll
- xoff: .byte 0 ;[57] "
- kwrk01 .byte 0 ;[1.14]
- .ifne debug ;[1] conditional assembly
- xofcnt .byte 0 ;count of times buffer overran
- cixon .byte 0 ;[1] count of input xon request
- cixoff .byte 0 ;[1] " xoff "
- cinixn .byte 0 ; count of input no interupt xon
- cinixf .byte 0 ; " xoff
- coxon .byte 0 ;[1] count of ouput xon requests
- coxoff .byte 0 ;[1] " xoff "
- caixon .byte 0 ;[1] count of actual input xon sent
- caixof .byte 0 ;[1] " xoff "
- .endc ;[1]
- hxon = $91 ;^Q with high bit on
- hxoff = $93 ;^S "
- null = 0 ;null com character
- ctrlq = $11 ;xon ^Q
- ctrls = $13 ;xoff ^S
- irqsva = $45 ;place dos saves a reg
- dirq = $3fe ;[51] interupt address
- tcps = $4f8 ; //c port status + slot
- sscstp = $578 ;[47] +slot,bit 7 on turns off commands to ssc
- herld nasc <SSC V1.15> 1 ;tell who we are
- bad nasc <COM RTN ASM TOO LOW> 1
- bcom .byte '<
- nasc <- BAD COM CMD> 1
-
- ;
- ; Super Serial Card I/O Device support - These routines support the
- ; Apple Super Serial Card.
- ;
- tl2nts: pla ;[51] restore x
- tax ;[51]
- jmp (hdirq) ;[51] and pass it on sans a reg
-
- tl2rpt: ;[51] a is already saved in irqsva
- txa ;[51] save x
- pha ;[51]
- tl2rpe ;[67] enhanced // has all regs saved
- lda kr2pst ;[51] get status
- bpl tl2nts ;[51] not our interupt
- .ifne debug ;[1.8]
- pha ;[1.8]
- and #mssodb ;[1.8] overrun detected?
- beq .+3 ;[1.8] no
- brk ;[1.8] yes cataclismic but it does the job
- pla ;[1.8] restore input ch
- .endc ;[1.8]
- and #mssinb ;[51] look at input bit,since output may be stalled
- bne tl2inp ;[51] this is input ready
- tl2out:
- bit flowfg ;[57] is flow controll on?
- bpl tl2xfs ;[57] no
- bvs tl2jcm ;[59] yes, is output ctlr S on?, yes
- lda xoff ;[57] have we given the ^S ?
- beq tl2ou0 ;[57] maybe
- lda xon ;[57] yes
- bne tl2xfs ;[57] is it time to give the xoff ?
- .ifne debug ;[1]
- inc caixof ;[1] bump count of actual input xoffs given
- .endc ;[1]
- lda #ctrls ;[57] yes
- sta xon ;[57] tatle
- ;[1.14] jmp tl2ou2 ;[1][57] always jump
- bne tl2ou2 ;[1.14] always jump
- tl2ou0: lda xon ;[57] how about giving the xon ?
- beq tl2xfs ;[57] no
- .ifne debug ;[1]
- inc caixon ;[1] bump count of actual input xons given
- .endc ;[1]
- lda #0 ;[57] turn off xoff
- sta xoff ;[57]
- sta xon ;[57]
- lda #ctrlq ;[57] now for the xon
- tl2ou2: jsr telspa ;[57] set parity correctly x reg clobbered
- tl2oup sta kr2pch ;[57] stop this flood
- tl2jcm jmp tl2com ; thats all
- tl2xfs
- lda outptr ;[51] see if any to output
- cmp poutpt ;[51]
- ;[1.14] beq tl2noo ;[51] no more to output
- beq tl2ou7 ;[1.14] no more to output
- inc poutpt ;tell we have output one
- cmp poutpt ; now cmp
- ;[1.14] beq tl2com ; thats all
- beq tl2ou7 ;[1.14] thats all
- ldx poutpt ;[51] pointer to next ch to output
- lda outbuf,x ;[51] get next ch
- tl2rpp sta kr2pch ;[51] give it to card
- jmp tl2com ;[51] common return
- tl2ou7 jsr tl2noi ;[1.14] turn off output
- jmp tl2noo ;[1.14]
- tl2inp: lda kr2pch ;[51] we have an input character
- ldx pinptr ;[51] pointer to next input character
- store ;[1.14] this is where we store the input chs
- sta inbuf,x ;[51] save ch
- ;[1.14] inc pinptr ;[51] ready for next input
- bit flowfg ;[57] are we flow controll
- bpl tl2icm ;[57] no we may overun the buffers
- ; bvc tl2in2 ;[59] are we already stoped?, yes
- ;[1.14] lda inbuf,x ;[59] is host telling us stop ? bit doesnt des a reg
- and #$7f ;[59] ignore parity
- cmp #ctrlq ;[59] do we have a continue
- bne tl2in2 ;[59] no
- lda #$bf ;[59] yes, now turn on flow
- and flowfg ;[59]
- sta flowfg ;[59]
- jsr tl2suo ;[1.14] start up output
- .ifne debug ;[1]
- inc coxon ;[1] bump count of output xons given
- .endc ;[1]
- ;[1.14] dec pinptr ;[59] and ignore this character
- ;[1.14] jmp tl2icm ;[59] and carry on
- jmp tl2noo ;[1.14] skip the increment
- tl2in2 cmp #ctrls ;[59] do we have a stop?
- bne tl2in4 ;[59]
- .ifne debug ;[1]
- inc coxoff ;[1] bump count of output xoffs given
- .endc ;[1]
- lda #$40 ;[59] yes tell all
- ora flowfg ;[59] would you believe the remote
- sta flowfg ;[59] has asked us to stop!
- jsr tl2suo ;[1.14] start up output
- ;[1.14] dec pinptr ;[59] ignore this character
- ;[1.14] jmp tl2icm ;[1] thats all
- jmp tl2noo ;[1.14] skip the increment
- tl2in4 ;[59] place to hang ones hat
- ;[1.14] lda xoff ;[57] have we already asked for ^S ?
- ;[1.14] bne tl2icm ;[57] yes no need for another
- ;[1.14] txa ;[59] lets try stoping when half full
- ;[1.14] clc ;[59]
- ;[1.8] adc #7 ;[1]
- ;[1.14] adc #128 ;[1.8]
- ;[1.14] cmp inptr ;[59] are we filling up ?
- ;[1.14] bne tl2icm ;[57] no
- ;[1.14] inc xoff ;[57] turn on xoff(non 0)
- ;[1.14] .ifne debug
- ;[1.14] inc xofcnt ;just for debug
- ;[1.14] .endc
- tl2icm
- inc pinptr ;[1.14] now bump the ptr
- bne tl2noo ;[1.14] thats all
- ldx store+2 ;[1.14] now for the msb
- inx ;[1.14]
- cpx #outbuf^ ;[1.14] too far?
- bne tl2ic0 ;[1.14] no
- ldx #inbuf^ ;[1.14] yes
- tl2ic0 stx store+2 ;[1.14] update the msb
- tl2noo
- tl2xor
- tl2com: pla ;[51] get x
- tax ;[51]
- tl2eac lda irqsva ;[51] get a
- tl2rti rti ;[51] return from interupt
-
- tl2noi lda #mnint ; input interupts only
- tl2no7 sta kr2pcr ; give the command
- rts ;
- tl2suo lda #mnminb ; both interupts
- bne tl2no7 ; common code
-
- tl2int: sei ; lock out interupts may be required for the //c
- ;[1.14] lda hdirq ;see if we already saved
- ;[1.14] bne init0 ;yes
- lda hdirq+1 ;maybe
- bne init0 ;sure thing
- lda dirq ;[51] save dos IR for exit
- sta hdirq ;[51]
- lda dirq+1 ;[51]
- sta hdirq+1 ;[51]
- lda #start^
- cmp endker+1 ;are we loaded above main
- beq dontno ;cant tell yet
- bcc trble ;yes we are in trouble
- bcs setnm ;ok
- dontno lda #start\ ;well lets check 16 bits
- cmp endker
- ;[1.14] beq setnm ;whee just exactly right
- bcs setnm ;ok
- trble ldx #bad\ ;got to tell someone
- ldy #bad^
- jsr tl2prn ;print the message
- setnm:
- init0: lda kerins ;[47] initialize slot
- beq init1
- cli ;[47] already initialized return
- rts
-
- ; apple machine id
- ;rom--> $fbb3 $fbc0
- ; II $38
- ; II+ $ea
- ; //e $06 $ea
- ; //e+ $e0 enhanced
- ; //c $06 $00
- ;prodos--> $bf98
- ; II,II+,//e bit 3 = 0
- ; others bit 3 = 1
- ; //c bits 7,6 = 10
-
- ;setc ldx #tecome-tecoms ; size of the end of interupt
- ;setcl lda tecoms-1,x ; move to the end
- ; sta tl2com-1,x
- ; dex ; are we thru
- ; bne setcl ; no
- ; lda kersli ; change from $n0 -> $0n
- ; lsr a
- ; lsr a
- ; lsr a
- ; lsr a
- ; sta tecome+1 ; make it short
- ; ldx #terpte-tecome ; size of start of interupt
- ;setcl1 lda tecome-1,x ; move to the start
- ; sta tl2c-1,x
- ; dex ; thru ?
- ; bne setcl1 ; no
- ; lda #tl2c\ ; now for the interupt vector
- ; sta dirq
- ; lda #tl2c^
- ; jmp seten1 ; now for the common code
- setc ;[1.14]
- lda #$60 ;[1.14] its a rts
- sta tl2suo ;[1.14] ignore this for //c
- sta tl2noi ;[1.14]
- bne setenh ;[1.14]
- init1 lda $fbc0
- beq setc ; this is a //c
- cmp #$e0 ; is this an enhanced 2e?
- bne init3 ; no
- ;[1.14]setc
- setenh lda tl2rti ; yes
- sta tl2com
- lda #tl2rpe\ ;[67][51]
- sta dirq ;[67][51] setup inturpt address
- lda #tl2rpe^ ;[67][51]
- seten1 sta dirq+1 ;[67][51]
- ldx #0 ; now set the stack straight
- seten2 lda tl2nts+2,x ; in case its not our interupt
- sta tl2nts,x
- inx
- cpx #3 ; are we thru?
- bne seten2 ; no
- ldx #0 ; now set up the ram banks for interupts
- bit $c011
- bmi .+4 ;hate to do this
- ldx #8
- bit $c012
- bpl .+4 ;ssigh!
- inx
- inx
- bit $c081
- bit $c081
- phx ;save the current state for later
- ; .byte $da
- lda $c016 ;how about it
- asl a
- ldy #1
- tl2ilp lda $fffe,y
- sta $c009 ;set alt card
- sta $fffe,y
- sta $c008 ;now for main ram
- sta $fffe,y
- dey
- bpl tl2ilp
- bcc .+5 ;have we switch out the wrong one?
- sta $c009 ;yes
- plx
- ; .byte $fa
- bit $c081,x
- ; .byte $3c,$81,$c0
- bit $c081,x
- ; .byte $3c,$81,$c0
- jmp init4 ;[67]
- init3
- lda #tl2rpt\ ;[67][51]
- sta dirq ;[67][51] setup inturpt address
- lda #tl2rpt^ ;[67][51]
- sta dirq+1 ;[67][51]
- init4 ;[67]
- lda #0 ;[51] clear pointers etc
- sta inptr ;[51]
- sta pinptr ;[51]
- sta outptr ;[51]
- sta poutpt ;[51]
- lda #inbuf^ ;[1.14] and the msb also
- sta store+2 ;[1.14]
- sta get+2 ;[1.14]
- ldx kersli ;[47] get slot number
- stx kerins ;[67] tell weve been here
- clc
- ;[1.14] lda status
- lda #kr2pst\ ;[1.14] easy way - status
- adc kersli ; calculate proper address for status
- sta tl2rpe+1 ; and set interupt rtn
- sta cwsou1+1 ; [75] this was a tough bug to find
- clc
- ;[1.14] lda getput
- lda #kr2pch\ ;[1.14] data
- adc kersli ; calulate proper address for ld & st
- sta tl2rpp+1 ; and set interupt rtn
- sta tl2inp+1
- sta tl2oup+1
- sta cwsou2+1 ;[75] tough to find
- sta tl2pp7+1 ;[1.14]
- lda #kr2pcr\ ;[1.14] command
- clc ;[1.14]
- adc kersli ;[1.14]
- sta tl2no7+1 ;[1.14]
- lda #mnminb ;[47] Master port init
- ;[1.14] sta kr2pst,x ;[47] Com port status
- sta kr2pcr,x ;[47] Com master port
- lda #mncinb ;[47] Control port init
- and #$f0 ;[47] drop baud
- ora sscdbd ;[47] and add default baud
- sta kr2pcc,x ;[47]
- tl2prr:
- cli ;[51] allow the interurpts to happen
- rts ;[22] Return
- ;[1.14]status .word kr2pst ; status port for ssc
- ;[1.14]getput .word kr2pch ; read write port for ssc
-
- tl2cp: sei ;[51] lockout inturpts
- lda inptr ;[51] check input for chs
- cmp pinptr ;[51]
- bne tl2cp3 ;[1.14] how about msb, no
- lda store+2 ;[1.14] yes check that also
- cmp get+2 ;[1.14]
- tl2cp3 ;[1.14]
- cli ;[51] allow interupts
- rts ;[22] ...
-
- tl2gpc: sei ;[51] lockout interupts
- ldx inptr ;[51] get input character
- get ;[1.14]
- lda inbuf,x ;[51]
- inc inptr ;[51] bump in pointer
- bne tl2gp0 ;[1.14]
- ldy get+2 ;[1.14] bump msb also
- iny ;[1.14]
- cpy #outbuf^ ;[1.14] too far?
- bne tl2gp7 ;[1.14] no
- ldy #inbuf^ ;[1.14] yes, circle those wagons
- tl2gp7 sty get+2 ;[1.14] msb
- ;[1.14] ldy xon ;[57] are we flow controlling ?
- ;[1.14] beq tl2gp0 ;[57] no
- ;[1.14] inx ;[57]
- ;[1.14] inx ;[57]
- ;[1.14] inx ;[57]
- ;[1.14] cpx pinptr ;[57] have we about caught up ?
- ;[1.14] bne tl2gp0 ;[57] no
- ;[1.14] pha ;[1.8]
- ;[1.14] lda #ctrlq ;[1.14] bug pure and simple
- ;[1.14] jsr cwsout ;[1.8]
- ;[1.14] beq tl2gp4 ;[1.8] depend on acc of 0
- ;[1.14] lda #0 ;[1.8]
- ;[1.14] sta xon ;[1.8]
- ;[1.14]tl2gp4 sta xoff ;[1.8]
- ;[1.14] pla ;[1.8]
- ; pha ;[57] save ch
- ;[1.8] ldy #0 ;[57] turn off xon
- ;[1.8] sty xoff ;[57]
- ; pla ;[57] restore ch
- tl2gp0:
- cli ;[51] allow interupts
- tl2rtc: rts ;[22] and return
-
- tl2ppc: ;[22] Hold the byte to send
- sei ;[51] lockout interupts
- ldx outptr ;[51] get output pointer
- sta outbuf,x ;[51] save in buffer for interupt
- cpx poutpt ; has output stalled ?
- bne tl2pp2 ; no were still busy outputing
- ;[1.14] ldx kersli ; get slot
- ;[1.14] sta kr2pch,x ; and give ssc the ch
- tl2pp7 sta kr2pch ;[1.14]
- jsr tl2suo ;[1.14] start up output
- tl2pp2
- inc outptr ;[51] ready for next output
- cli ;[51] allow interupts
- rts ;[22] and return
-
- tl2exi: sei ;lockout interupts
- ;[1.10] lda hdirq ;have we alredy done this?
- ;[1.10] bne exit0 ;nope
- lda hdirq+1 ;maybe
- beq exit9 ;definitly
- exit0: lda hdirq ;[51] restore dos IRQ address
- sta dirq ;[51]
- lda hdirq+1 ;[51]
- sta dirq+1 ;[51]
- lda #0 ;tell we did this
- ;[1.10] sta hdirq
- sta hdirq+1
- ldx kersli ;[47] get slot number
- sta kr2pst,x ;shut it down
- sta kr2pcr,x
- ;[1.12]exit9: cli ;allow the interupts
- exit9: ;[1.12]cli ;allow the interupts
- rts
- cwsout ;ldx kersli ; see if we can start up output
- tax ; save the output ch
- cwsou1 lda kr2pst ; get the status
- and #mssoub ; is the output bit 1?
- beq cwsou3 ; no sigh!
- txa ; get the ch to output
- and #$7f ; drop parity
- jsr telspa ; set parity correctly x reg clobbered
- cwsou2 sta kr2pch ; send the ch
- jsr tl2suo ;[1.14]
- lda #true ; say we did it
- cwsou3 rts ; bye
- tl2cmd: ;find out what command
- ;[1.14] beq tl2rts ;its drop line and we cant
- beq tl2exi ;[1.14]its drop line
- cmp #$0c
- beq break ;its a break command
- cmp #$0b
- beq baud ;its a set baud command
- cmp #hxon
- beq txon ;its a turn xon
- cmp #hxoff
- beq txoff ;its a turn xoff
- jsr prbyte ;print command
- ldx #bcom\ ;and tell all
- ldy #bcom^
- tl2prn jsr prstr
- jsr prcrlf
- tl2fls: ;a false return
- tl2rts: ;tell that we cant
- lda #0 ;unknown command
- rts ;return
- txon: ;bit flowfg ;do we have flow control
- ; bpl tl2fls ;no can do
- sei ;protect ourselves from interupts
- .ifne debug ;[1]
- inc cixon ;[1] bump count of xon requests
- .endc ;[1]
- jsr cwsout ; can we start up output?
- beq txon3 ; no do the interupt thing
- lda #0 ; yes, tell its all done
- sta xoff
- sta xon
- .ifne debug ;[1]
- inc cinixn ;[1] bump count of xon requests without interupts
- .endc ;[1]
- lda #true ; tell its ok
- cli ; allow interupts
- rts ; thats all
- txon3 ; do the interupt flow control
- lda #0
- sta xoff ;tell interupt to start up
- cli
- ltxon lda xon ;[1] got to wait for ch to be sent
- bne ltxon ;[1] its called true syncronization
- lda #true ;give a true return
- rts
- txoff: ;bit flowfg ;do we have flow control ?
- ; bpl tl2fls ;no
- sei
- .ifne debug ;[1]
- inc cixoff ;[1] bump count of xoff requests
- .endc ;[1]
- jsr cwsout ; can we send output
- beq txoff3 ; no sigh!
- .ifne debug ;[1]
- inc cinixf ;[1] bump count of xoff requests without interupt
- .endc ;[1]
- lda #true ; just in case we have to xon via interupts
- sta xon
- sta xoff
- cli ; allow interupts
- rts
- txoff3 ; do it durring interupt
- lda #true ;we need xoff
- sta xoff ;this also gives a true return
- cli
- ltxoff lda xon ;[1] wait for it to be sent
- beq ltxoff ;[1] are we syncronized? no
- rts
- baud: ldx kersli ;[47] get slot number
- sei ;protect ourselves
- lda kr2pcc,x ;[47] get com control
- and #$f0 ;[47] and clear baud
- ora sscdbd ;[47] enter
- sta kr2pcc,x ;[47] and set new baud rate
- cli ; now its ok
- rts ;return true(non 0)
- break:
- sei ;lock out interupts
- ldy kersli ;[47] ss card routine is not on
- ;[1.13] lda #$c ;[47]
- lda kr2pcr,y ;[1.13] get current command
- ora #$c ;[1.13] now for the break
- sta kr2pcr,y ;[47] start the break
- ;[1.9] lda #233 ;[47] for 233 millseconds
- ;[1.9] jsr wait ;[47] the y reg is not clobered
- ;[1.14] lda #220 ;[1.9] wait 125 ms
- lda #233 ;[1.9] wait 233 ms
- sta kwrk01 ;[1.14]
- break3 lda timect ;[1.14] 1 ms at a time
- jsr wait ;[1.9] only the a reg is clobered
- dec kwrk01 ;[1.14]
- bne break3 ;[1.14]
- ;[1.14] lda #206 ;[1.9] how about 108 ms
- ;[1.14] jsr wait ;[1.9] only the a reg is clobered
- lda #mnminb ; start up the port again
- sta kr2pcr,y ;[47]
- cli ;allow interupts
- lda #true ;return true
- rts
- ;[1.14]inbuf .blkb 256 ;input buffer
- inbuf .blkb $900 ;[1.14]input buffer ***** inbuf & outbuf no separations
- outbuf .blkb 256 ;output buffer
- endcom ;[1.11]
-